package l4cr

import javax.jws.*


class Looking4ClassroomService {
	static expose=['cxfjax']

	//Retourne la liste de toutes les salles
	@WebResult(name="listeAll")
	@WebMethod(operationName="listAll")
	def listAll() {
		return Salle.list().toString()
	}

	//Retourne la liste des salles disponibles pour une date (j/m/a h:min), une duree d et necessitant une capacite c
	@WebResult(name="sontDispo")
	@WebMethod(operationName="listDispo")
	String listDispo(@WebParam(name="capacite")int c,@WebParam(name="duree")int d,
	@WebParam(name="jour")int j,@WebParam(name="mois")int m,@WebParam(name="annee")int a,
	@WebParam(name="heure")int h,@WebParam(name="min")int min) {
		//Creation des bornes inferieures et superieures de recherche
		Date bInf = new Date(a,m,j,h,min)
		Date bSup = ajouter(bInf, d)
		//Recherche des salles dont la capacite correspond et ne comprenant pas de reservation entre les bornes de recherche
		def res = []
		Salle.list().each {
			if(it.capacite>=c) {
				def verif = true
				it.reservations.each {
					if((bInf.after(it.deb) & bInf.before(it.fin)) ||
					(bSup.after(it.deb) & bSup.before(it.fin)) ||
					(bInf.before(it.deb) & bSup.after(it.fin)))
						verif = false
				}
				if(verif)
					res.add(it)
			}
		}
		return res.toString()
	}

	//Reserver une salle avec son identifiant ids pour un cours c d'une duree d a une date (j/m/a h:min)
	@WebResult(name="reservation")
	@WebMethod(operationName="reserver")
	String reserver(@WebParam(name="ids")String ids,@WebParam(name="cours")String c,@WebParam(name="duree")int d,
	@WebParam(name="jour")int j,@WebParam(name="mois")int m,@WebParam(name="annee")int a,
	@WebParam(name="heure")int h,@WebParam(name="min")int min) {
		//Verification que la salle demandee existe
		if (Salle.findById(ids)==null) {
			return "Cette salle n'existe pas"
		}
		//Creation des dates de debut et de fin de la reservation
		Date tDeb = new Date(a,m,j,h,min);
		Date tFin = ajouter(tDeb, d);
		//Verification que la salle est bien disponible
		boolean verif=true;
		Salle.findById(ids).reservations.each {
			if((tDeb.after(it.deb) & tDeb.before(it.fin)) ||
			(tFin.after(it.deb) & tFin.before(it.fin)) ||
			(tDeb.before(it.deb) & tFin.after(it.fin)) ||
			(tDeb==it.deb) || (tFin==it.fin))
				verif = false
		}
		if(verif) {
			//Reserve la salle demandee pour le creneau prevu
			return Salle.findById(ids).addToReservations(new Reservation(cours:c,deb:tDeb,fin:tFin)).toString()
		} else { return "salle non disponible"}
	}

	//Modifier une reservation avec son identifiant idr et les donnees de reservation
	@WebResult(name="modifierReservation")
	@WebMethod(operationName="modifierReservation")
	String modifierReservation(@WebParam(name="ids")String ids,
	@WebParam(name="idr")String idr, @WebParam(name="cours")String c,
	@WebParam(name="duree")int d, @WebParam(name="jour")int j,
	@WebParam(name="mois")int m,@WebParam(name="annee")int a,
	@WebParam(name="heure")int h,@WebParam(name="min")int min) {

		//Verification que la salle demandee existe
		if (Salle.findById(ids)==null) {
			return "Cette salle n'existe pas"
		}
		//Verification que la reservation existe
		if (Reservation.findById(idr)==null) {
			return "Cette Reservation n'existe pas"
		}

		// sauvegarde de l'ancienne reservation pour si on peut pas la modifier
		def oldr = Reservation.findById(idr)
		def olds
		Salle.list().each {
			if(it.reservations.contains(oldr)) {
				olds = it.id
				it.removeFromReservations(oldr)
			}
		}

		//Supprime l'ancienne reservation
		supprimerReservation(idr)

		//Creation des dates de debut et de fin de la reservation
		Date tDeb = new Date(a,m,j,h,min);
		Date tFin = ajouter(tDeb, d);
		//Verification que la salle est bien disponible
		boolean verif=true;
		Salle.findById(ids).reservations.each {
			if( (tDeb.after(it.deb) & tDeb.before(it.fin)) ||
			(tFin.after(it.deb) & tFin.before(it.fin)) ||
			(tDeb.before(it.deb) & tFin.after(it.fin)))
				verif = false
		}
		if(verif) {
			//Reserve la salle demandee pour le creneau prevu
			return Salle.findById(ids).addToReservations(new Reservation(cours:c,deb:tDeb,fin:tFin)).toString()
		} else {
			return "resevation non modifier"//+Salle.findById(olds).addToReservations(new Reservation(cours:old.cours,deb:old.deb,fin:old.fin)).toString()
		}

	}

	//Supprime une reservation avec son identifiant idr
	@WebResult(name="supprimerReservation")
	@WebMethod(operationName="supprimerReservation")
	String supprimerReservation(@WebParam(name="idr")String idr) {
		//Verification que la reservation existe
		if (Reservation.findById(idr)==null){
			return "Cette reservation n'existe pas"
		}
		//Recherche de la reservation
		def r = Reservation.findById(idr)
		Salle.list().each {
			if(it.reservations.contains(r))
				it.removeFromReservations(r)
		}
		//Suppression de la reservation
		if (r.delete(flush:true)==null)
		//r.delete(flush:true).toString()
		return "La reservation a ete supprime"
	}

	//Retourne la liste des reservations pour un cours c
	@WebResult(name="listReservation")
	@WebMethod(operationName="listReservation")
	String listReservation(@WebParam(name="cours")String c) {
		return Reservation.list().each() {
			it.cours == c}.toString()
	}

	//Retourne une date correspondant a une date t augmentee d'un duree d en min
	Date ajouter(Date t, int d) {
		long l = t.getTime() + (long) (d*60*1000)
		return new Date(l)
	}
}
